home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / msysjour / vol06 / 01 / kermit / bintodec.w < prev    next >
Text File  |  1990-12-31  |  1KB  |  50 lines

  1. #include <stdio.h>
  2.  
  3. int state, s = 1, m = 0, d;
  4. float f;
  5. char *b;
  6.  
  7. /* Declare wart states */
  8. %states sign mantissa fraction
  9.  
  10. /* Begin state table */
  11.  
  12. %%                                        
  13. <sign>-      { s = -1; BEGIN mantissa; }  /* Look for sign */
  14. <sign>0      { m = 0;  BEGIN mantissa; }  /* Got digit, 
  15.                                              start mantissa */
  16. <sign>1      { m = 1;  BEGIN mantissa; }
  17. <sign>.      { fatal("bad input"); }    /* Detect bad format */
  18. <mantissa>0  { m *= 2; }                /* Accumulate mantissa */
  19. <mantissa>1  { m = 2 * m + 1; }
  20. <mantissa>$  { printf("%d\n", s * m); return; }
  21. <mantissa>.  { f = 0.0; d = 1; BEGIN fraction; } /* Start fraction */
  22. <fraction>0  { d *= 2; }                    /* Accumulate fraction */
  23. <fraction>1  { d *= 2; f += 1.0 / d; }
  24. <fraction>$  { printf("%f\n", s * (m + f) ); return; }
  25. <fraction>.  { fatal("bad input\n"); }
  26. %%
  27.  
  28. input(void) {       /* Define input() function */
  29.     int x;
  30.     return(((x = *b++) == '\0') ? '$' : x );
  31. }
  32.  
  33. fatal(char *s) {                    /* Error exit */
  34.  
  35.     fprintf(stderr,"fatal - %s\n",s);
  36.     exit(1);
  37. }
  38.  
  39. main(int argc,char **argv) {    /* Main program */
  40.     if (argc < 2) {
  41.         fprintf(stderr, "Not enough input\n");
  42.         exit(1);
  43.     }
  44.     b = *++argv;
  45.     state = sign;           /* Initialize state */
  46.     wart();                 /* Invoke state switcher */
  47.     exit(0);                /* Done */
  48. }
  49.  
  50.